<?php

namespace app\api\controller;

use app\admin\logic\AddressLogic;
use app\admin\model\Address;
use app\api\validate\Address as ValidateAddress;
use support\Request;
use think\Validate;
use Webman\Exception\BusinessException;

class AddressController extends BaseClientController
{
    /**
     * 获取当前用户的地址列表
     *
     * 该方法用于处理获取当前用户所有地址列表的请求，
     * 根据用户 ID 从数据库中查询地址信息，并返回地址列表及总数。
     *
     * @param Request $request 请求对象，包含客户端发送的请求信息
     * @return Response 返回操作结果，包含地址列表和地址总数
     */
    public function index(Request $request)
    {
        // 从请求中获取当前用户的 ID
        $uid = $request->uid;
        // 根据用户 ID 查询该用户的所有地址记录，并将结果转换为数组
        $addressList = Address::query()->where('customer_id', $uid)->select()->toArray();
        // 根据用户 ID 查询该用户的地址记录总数
        $total = Address::query()->where('customer_id', $uid)->count();
        // 返回成功响应，响应数据包含地址列表和地址总数
        return $this->success(['list' => $addressList, 'total' => $total]);
    }

    /**
     * 添加用户地址
     *
     * 该方法用于处理添加用户地址的请求，接收客户端提交的地址数据，
     * 对数据进行校验，校验通过后将地址信息保存到数据库中。
     *
     * @param Request $request 请求对象，包含客户端发送的 POST 请求数据
     * @return Response 返回操作结果，添加成功后返回新创建的地址信息
     * @throws BusinessException 若数据校验失败，抛出业务异常
     */
    public function add(Request $request)
    {
        // 获取客户端通过 POST 请求提交的数据
        $data = $request->post();
        // 校验数据
        // 创建地址验证器实例，用于验证客户端提交的地址数据
        $validator = new ValidateAddress();

        // 调用验证器的 check 方法对数据进行校验
        // 若校���不通过，则执行以下逻辑
        if (!$validator->check($data)) {
            // 抛出业务异常，异常信息为验证器返回的错误信息，错误码为 400
            throw new BusinessException($validator->getError(), 400);
        }

        // 将当前用户的 ID 添加到数据中，作为地址所属的用户标识
        $data['customer_id'] = $request->uid;
        // 使用 Address 模型创建一条新的地址记录，并将数据保存到数据库
        $address = Address::create($data);
        // 返回成功响应，将新创建的地址信息作为响应数据返回
        return $this->success($address);
    }

    /**
     * 更新用户地址
     *
     * 该方法用于处理更新用户地址的请求，接收客户端提交的地址数据，
     * 对数据进行校验，校验通过后更新地址信息到数据库中。
     *
     * @param Request $request 请求对象，包含客户端发送的请求信息
     * @return Response 返回操作结果，包含更新后的地址信息
     * @throws BusinessException 若数据校验失败或地址不存在，抛出业务异常
     */
    public function update(Request $request)
    {
        $uid = $request->uid;
        $data = $request->post();
        
        // 验证数据
        $validator = new ValidateAddress();
        if (!$validator->check($data)) {
            throw new BusinessException($validator->getError(), 400);
        }
        
        // 检查地址是否存在且属于当前用户
        $address = Address::where('id', $data['id'])->where('customer_id', $uid)->find();
        if (!$address) {
            throw new BusinessException('地址不存在或无权修改', 400);
        }
        
        // 更新地址信息
        $address->save($data);
        
        return $this->success($address);
    }

    /**
     * 删除用户地址
     *
     * 该方法用于处理删除用户地址的请求，接收一个包含地址 ID 的 POST 请求，
     * 验证该地址是否存在且属于当前用户，若存在则删除该地址。
     *
     * @param Request $request 请求对象，包含客户端发送的请求信息
     * @return Response 返回操作结果，删除成功返回成功响应
     * @throws BusinessException 若地址不存在或不属于当前用户，抛出业务异常
     */
    public function destory(Request $request)
    {
        // 从 POST 请求中获取要删除的地址 ID
        $id = $request->post('id');
        // 查询指定 ID 且属于当前用户的地址记录
        $address = Address::query()->where('id', $id)->where('customer_id', $request->uid)->select();
        // 检查地址记录是否存在
        if (!$address) {
            // 若地址不存在，抛出业务异常并给出提示信息，错误码为 400
            throw new BusinessException('地址不存在', 400);
        }
        // 若地址存在，执行删除操作
        $address->delete();
        // 删除成功，返回成功响应
        return $this->success();
    }
}
